Ruby 日記 35日目: Enumeratorオブジェクトの構造
次のプログラムの実行結果を得るために__(1)__に適切なメソッドをすべて選んでください。
code:rb
class Array
def succ_each(step = 1)
return __(1)__(__method__, step) unless block_given?
each do |int|
yield int + step
end
end
end
p int.chr
}
code:実行結果
"b"
"c"
"d"
選択肢:
enum
enum_chr
to_enum
enum_for
解説:
類似問題は
あたりかな
Object#to_enumとObject#enum_forは必須知識だね〜
to_enum(method = :each, *args) -> Enumerator
enum_for(method = :each, *args) -> Enumerator
to_enum(method = :each, *args) {|*args| ... } -> Enumerator
enum_for(method = :each, *args) {|*args| ... } -> Enumerator
Enumerator.new(self, method, *args) を返します。
ブロックを指定した場合は Enumerator#size がブロックの評価結果を返 します。ブロックパラメータは引数 args です。
正解は「to_enum」と「enum_for」だ
code:sh
# ruby gold/ex35/choice01.rb
gold/ex35/choice01.rb:3:in succ_each': undefined method enum' for 97, 98, 99:Array (NoMethodError) from gold/ex35/choice01.rb:11:in `<main>'
# ruby gold/ex35/choice02.rb
gold/ex35/choice02.rb:3:in succ_each': undefined method enum_chr' for 97, 98, 99:Array (NoMethodError) from gold/ex35/choice02.rb:11:in `<main>'
# ruby gold/ex35/choice03.rb
"b"
"c"
"d"
# ruby gold/ex35/choice04.rb
"b"
"c"
"d"
/icons/hr.icon
Enumeratorオブジェクトって、入れ子構造になっているんだね。
code:gold/ex35/sample.rb
class Array
def succ_each(step = 1)
return to_enum(__method__, step) unless block_given?
each do |int|
yield int + step
end
end
end
p enumerator
p enumerator.map
p enumerator.reverse_each.map
code:sh
# ruby gold/ex35/sample.rb
#<Enumerator: #<Enumerator: ...>:method(args)>